package cn.cyh.imeans.utils;

import cn.cyh.imeans.enums.PlateColorEnum;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 车牌号校验 工具类
 */
public class CarNumberUtil {
    private CarNumberUtil() {}

    public static final String PLATE_COLOR = "color";
    public static final String PLATE_NUMBER = "clxx";

    /**匹配武警车牌**/
    private static final Pattern REGULAR_1 = Pattern.compile("^WJ[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]?[0-9a-zA-Z]{5}$");
    /**匹配军牌**/
    private static final Pattern REGULAR_2 = Pattern.compile("/[A-Z]{2}[0-9]{5}$/");
    /**
     * 现在大多数车牌 - 匹配民用车牌和使馆车牌
     * 第一位为汉字省份缩写项目
     * 第二位为大写字母城市编码
     * 后面是5位仅含字母和数字的组合
     * **/
    private static final Pattern REGULAR_3 = Pattern.compile("^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$");
    /**
     * 新能源车牌号
     * 省份简称（1位汉字）+发牌机关代号（1位字母）+序号（6位）。
     * 小型新能源汽车号牌的第一位必须使用字母D、F（D代表纯电动新能源汽车，F代表非纯电动新能源汽车），第二位可以使用字母或者数字，后四位必须使用数字。
     * 大型新能源汽车号牌的前五位必须使用数字，第六位必须使用字母D、F（D代表纯电动新能源汽车，F代表非纯电动新能源汽车）。
     * 序号中英文字母I和O不能使用。
     * **/
    private static final Pattern REGULAR_4 = Pattern.compile("^(([\\u4e00-\\u9fa5]{1}[A-Z]{1})[-]?|([wW][Jj][\\u4e00-\\u9fa5]{1}[-]?)|([a-zA-Z]{2}))([A-Za-z0-9]{5}|[DdFf][A-HJ-NP-Za-hj-np-z0-9][0-9]{4}|[0-9]{5}[DdFf])$");
    /**
     * 农用车辆及拖拉机车牌号
     * 农用车车牌号示例：山东01-54321, 山东A54321
     * 手扶拖拉机：示例：鲁1961378
     * **/
    private static final Pattern REGULAR_5 = Pattern.compile("^(([\\u4e00-\\u9fa5][a-zA-Z]|[\\u4e00-\\u9fa5]{2}\\d{2}|[\\u4e00-\\u9fa5]{2}[a-zA-Z])[-]?|([wW][Jj][\\u4e00-\\u9fa5]{1}[-]?)|([a-zA-Z]{2}))([A-Za-z0-9]{5}|[DdFf][A-HJ-NP-Za-hj-np-z0-9][0-9]{4}|[0-9]{5}[DdFf])$");


    /**
     * 校验车牌号
     * @param number 车牌号
     * @return bool
     */
    private static boolean valid(String number) {
        return REGULAR_1.matcher(number).matches() || REGULAR_2.matcher(number).matches()
                || REGULAR_3.matcher(number).matches() || REGULAR_4.matcher(number).matches()
                || REGULAR_5.matcher(number).matches();
    }

    /**
     * 将格式正确的车牌号返回
     * @param numbers 车牌号数据
     * @return JSONArray
     */
    public static List<Map<String, String>> getValidNumber(String numbers) {
        List<Map<String, String>> arr = new ArrayList<>(10);
        if(numbers == null || numbers.length() == 0) {
            return arr;
        }
        String[] split = numbers.split(",|，");
        for (String s : split) {
            if(s != null && s.length() > 0 && valid(s)) {
                Map<String, String> map = new HashMap<>(4);
                map.put(CarNumberUtil.PLATE_COLOR, PlateColorEnum.OTHER.getValue());
                map.put(CarNumberUtil.PLATE_NUMBER, s);
                arr.add(map);
            }
        }
        return arr;
    }

}
